版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2015/05/11/Spring 使用简单Demo进行源码调试(四)/
访问原文「Spring 使用简单Demo进行源码调试(四)」
接上篇日志Spring 使用简单Demo进行源码调试(三)继续。
第一步
展开loadBeanDefinitions(resources)。这个代码比较简单,是对每一个资源进行加载。
展开loadBeanDefinitions(resource)。这一步为从特定的XML文件中加载bean factory,使用EncodedResource包装传来的resource,然后进一步加载。EncodedResource结合特定编码的资源描述符或特定字符集用于阅读资源,这里的资源描述符和特定字符集都为。
第二步
展开 loadBeanDefinitions(new EncodedResource(resource));。这一步从encodedResource获取读入流,然后设置编码,最后通过doLoadBeanDefinitions(inputSource, encodedResource.getResource())进一步解析。
|
|
第三步
展开doLoadBeanDefinitions(inputSource, encodedResource.getResource())。这一步初始化Document实例,然后通过registerBeanDefinitions(doc, resource)注册bean定义。
第四步
展开registerBeanDefinitions(doc, resource)。这一步比较好理解,直接看documentReader.registerBeanDefinitions(doc, createReaderContext(resource))。
第五步
展开documentReader.registerBeanDefinitions(doc, createReaderContext(resource))。还是比较简单,哎,看doRegisterBeanDefinitions(root)这一步吧。
第六步
展开doRegisterBeanDefinitions(root)。这一步使用Doc里的root元素注册每一个bean定义。使用createDelegate的原因是任何嵌套的< bean>元素将导致该方法递归。为了传播和保存
第七步
展开parseBeanDefinitions(root, this.delegate)。这一步从文档的根元素解析文档。delegate.isDefaultNamespace(ele)这一步判断ele是不是默认命名域,这里的默认命名域为”http://www.springframework.org/schema/beans"。如果ele是默认命名域则解析ele,即parseDefaultElement(ele, delegate)。
第八步
展开parseDefaultElement(ele, delegate)。可以看到,我们是BEAN_ELEMENT,所以走processBeanDefinition(ele, delegate);这一步。
第九步
展开processBeanDefinition(ele, delegate)。这一步首先使用bean元素定义了BeanDefinitionHolder实例bdHolder,目前不详细解析了,BeanDefinitionHolder包含BeanDefinition名和别名,可以注册为一个内部bean的占位符。然后如果需要则修饰Bean定义。最后通过BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry())注册bean定义,BeanDefinitionReaderUtils类包含了bean定义阅读接口实现时有用的工具方法。
第十步
展开BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry())。首先获取bean名称;然后通过registry注册bean定义。
第十一步
展开registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition())。可以看到,这一步主要完成的工作有,bean定义校验、有旧定义是否可覆盖、添加新的bean定义。
到此为止bean定义的加载已经完成。但是由于代码过于复杂,没有分析很多细节以及异常,仅仅是将主要的一条线理了出来,还是远远不够的。有机会在进行深入解析。接下来会继续分析我们的demo运行。